package com.monster.dict.domain.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.monster.dict.domain.common.DictExceptionEnum;
import com.monster.dict.domain.convert.DictItemConvert;
import com.monster.dict.domain.dto.DictItemInsertDto;
import com.monster.dict.domain.dto.DictItemUpdateDto;
import com.monster.dict.domain.service.SysDictItemService;
import com.monster.dict.domain.vo.DictItemListVo;
import com.monster.dict.infrastructure.dao.SysDictItemDao;
import com.monster.dict.infrastructure.entity.SysDictItem;
import com.monster.exception.impl.MonsterNoTackException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 字典子表service层
 *
 * @author kuang
 */
@Service
public class SysDictItemServiceImpl implements SysDictItemService {
    /**
     * 转换器
     */
    @Autowired
    private DictItemConvert dictItemConvert;
    /**
     * 字典项数据dao
     */
    @Autowired
    private SysDictItemDao dictItemDao;

    /**
     * 通过字典编码查询字典项目
     *
     * @param dictCode 字典编码
     * @return List<DictItemListVo>
     */
    @Override
    public List<DictItemListVo> list(String dictCode) {
        return dictItemConvert.toDictItemListVos(dictItemDao.list(new LambdaQueryWrapper<SysDictItem>().eq(SysDictItem::getDictCode, dictCode)));
    }

    /**
     * 字典项数据新增
     *
     * @param insertDto 新增的数据项
     * @return String
     */
    @Override
    public String insert(DictItemInsertDto insertDto) {
        // 唯一校验
        if (dictItemDao.getOne(new LambdaQueryWrapper<SysDictItem>().
                eq(SysDictItem::getCode, insertDto.getCode()).
                eq(SysDictItem::getDictCode, insertDto.getDictCode())) != null) {
            throw new MonsterNoTackException(DictExceptionEnum.UNIQUE);
        }
        SysDictItem item = dictItemConvert.toSysDictItem(insertDto);
        if (dictItemDao.save(item)) {
            return item.getId();
        }
        return null;
    }

    /**
     * 字典项数据修改
     *
     * @param updateDto 修改的数据
     * @return boolean
     */
    @Override
    public boolean update(DictItemUpdateDto updateDto) {
        return dictItemDao.updateById(dictItemConvert.toSysDictItem(updateDto));
    }
    /**
     * 通过id删除数据
     * @param id 数据id
     * @return boolean
     */
    @Override
    public boolean delete(String id) {
        return dictItemDao.delById(id);
    }
    /**
     * 通过字典编码删除数据
     * @param dictCode 字典编码
     * @return boolean
     */
    @Override
    public boolean deleteByDictCode(String dictCode) {
        return dictItemDao.del(new LambdaQueryWrapper<SysDictItem>().eq(SysDictItem::getDictCode, dictCode));
    }
}
